package com.nereyda.application.managers
{
	import com.nereyda.view.GadgetWindow;
	
	import flash.events.MouseEvent;
	
	import mx.core.DragSource;
	import mx.core.UIComponent;
	import mx.events.DragEvent;
	import mx.managers.DragManager;

	public class DragDropManager
	{
		/**
		 * Coordenadas de inicio para la operación
		 * de drag & drop actual.
		 */
		[Bindable]
        public var xDragOff :Number;

		[Bindable]
        public var yDragOff :Number;
        
		/**
		 * Comienza la operación de arrastre del objeto especificado.
		 */
        public function doDragEnter(event:DragEvent, objectClass:Class):void 
        {
            DragManager.acceptDragDrop( objectClass(event.target) );
        }

		/**
		 * Suelta el objeto que está siendo arrastrado actualmente.
		 */
        public function doDragDrop(event:DragEvent):void 
        {
			// Calcula la nueva posición del objeto arrastrado.
			var tempX:int = event.currentTarget.mouseX - this.xDragOff;
			var tempY:int = event.currentTarget.mouseY - this.yDragOff;

			event.dragInitiator.x = tempX;
			event.dragInitiator.y = tempY;

			// Trae al frente de los demás componentes al que se arrastró.
			//
			UIComponent(event.target).setChildIndex(GadgetWindow(event.dragInitiator), UIComponent(event.target).numChildren-1);
        }

		/**
		 * Intercepta eventos los eventos MouseMove
		 * de las operaciones de Drag & Drop.
		 */
        public function MouseMoveHandler(event:MouseEvent):void 
        {
            var dragInitiator :UIComponent = UIComponent(event.currentTarget.parent);
            var source        :DragSource  = new DragSource();

            source.addData(event.currentTarget.parent, 'GadgetWindow'); 

            this.xDragOff = event.currentTarget.mouseX;
            this.yDragOff = event.currentTarget.mouseY;
            
            // Realiza la operación de drag & drop,
            //
            DragManager.doDrag(dragInitiator, source, event);
        }
            
		// Devuelve una instancia única de la clase.
		//
		private static var instance :DragDropManager = null;
		
		public static function getInstance():DragDropManager
		{
			if ( instance == null )
				instance = new DragDropManager();
			
			return( instance );
		}
	}
}